//
//
//  Generated by StarUML(tm) C++ Add-In
//
//  @ Project : OOAD5T
//  @ File Name : SensorController.cpp
//  @ Date : 2026-05-03
//  @ Author : 
//
//

const int DUST_THRESHOLD = 5;

#include "SensorController.h"
#include "ISensor.h"

SensorController::SensorController(EventBus* bus, ISensor* leftSensor, ISensor* rightSensor, ISensor* dustSensor) {
    this->bus = bus;
    this->leftSensor = leftSensor;
    this->rightSensor = rightSensor;
    this->dustSensor = dustSensor;
    isTurnOn = false;
    doCheck = false;
    bus->subScribeStartCleaning([this]() {
        this->doDustCheck();
        });
    bus->subScribeAvoidObstacle([this](SensorProvider* sensor) {
        this->stopDustCheck();
        });
    // 센서를 배열로 받아야하나? 근데 그럼 기능별로 어떻게 구분하지? 일단은 그냥 개별적으로 해둠
    //센서 임계점을 detect 함수에 인자로 넘겨서 판단하라 하거나 센서안에 상수 두거나 하면될듯
}

void SensorController::turnOn() {
    isTurnOn = true;
}

void SensorController::turnOff() {
    isTurnOn = false;
}

void SensorController::FrontObstacleDetected() {
    bus->publishAvoidObstacle(this);
}

bool SensorController::getLeftState() {
    return leftSensor->detect();
}

bool SensorController::getRightState() {
    return rightSensor->detect();
}

void SensorController::ChecknPowerUp() {
    if (doCheck) {
        if (dustSensor->detect()) {
            bus->publishDetectedDust();
        }
    }
}

bool SensorController::getIsTurnOn() {
    return isTurnOn;
}

void SensorController::doDustCheck() {
    doCheck = true;
}

void SensorController::stopDustCheck(){
    doCheck = false;
}
